package app

import (
	"fmt"
	"uni-core/globals"
	"uni-core/pkg/cryptokey"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/dialog"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"gitee.com/MM-Q/fastlog"
	"github.com/jmoiron/sqlx"
)

var (
	globalPswdData     globals.PswdDatas = globals.PswdDatas{} // 用于存储多个密码记录的切片
	currentSelectedRow globals.PswdData  = globals.PswdData{}  // 定义一个变量，用于存储实时更新的选中行(密码记录)
	globalTable        *widget.Table     = nil                 // 定义一个全局变量，用于存储表格(密码表格)
	showPassword       bool              = false               // 控制密码显示状态的全局变量
)

// updateTableData 更新表格数据
func updateTableData(table *widget.Table, data []globals.PswdData) {
	// 更新全局变量
	globalPswdData = data

	// 刷新表格
	if table != nil {
		// 如果表格未初始化, 则不刷新
		fyne.Do(func() {
			table.Refresh()
		})
	}
}

// pswdInitUi 初始化密码管理页面的用户界面
func pswdInitUi(db *sqlx.DB, log *fastlog.FastLog, w fyne.Window, a fyne.App) fyne.CanvasObject {
	// 创建一个搜索框
	searchEntry := widget.NewEntry()
	searchEntry.SetPlaceHolder("请输入搜索内容")

	// 中间边框容器：密码表格
	globalTable = pswdTabsInitUi()

	// 初始化数据
	queryPswdData(db, log)

	// 设置搜索框的回车事件
	searchEntry.OnSubmitted = func(text string) {
		// 执行搜索操作
		searchData(db, w, searchEntry, log, globalTable)
	}

	// 设置搜索框的搜索按钮
	searchButton := widget.NewButton("搜索", func() {
		searchData(db, w, searchEntry, log, globalTable)
	})

	// 设置搜索框的搜索按钮的重要性
	searchButton.Importance = widget.HighImportance

	// 设置搜索框的搜索按钮的图标,使用内置的搜索图标
	searchButton.SetIcon(theme.SearchIcon())

	// 创建密码显示切换按钮
	togglePasswordButton := widget.NewButton("解密", func() {})

	// 设置密码显示切换按钮的点击事件
	togglePasswordButton.OnTapped = func() {
		// 设置密码显示状态
		showPassword = !showPassword

		// 根据密码显示状态更新密码按钮的文本
		if showPassword {
			togglePasswordButton.SetText("加密")
		} else {
			togglePasswordButton.SetText("解密")
		}

		// 刷新表格数据
		globalTable.Refresh()
	}

	// 设置密码显示切换按钮的重要性
	togglePasswordButton.Importance = widget.HighImportance

	// 设置密码显示切换按钮的图标,使用内置的可见性图标
	togglePasswordButton.SetIcon(theme.VisibilityIcon())

	// 新增一个指定列数的网格容器
	grid := container.NewGridWithColumns(2,
		searchButton,         // 搜索按钮
		togglePasswordButton, // 密码显示切换按钮
	)

	// 顶部边框容器：密码显示切换按钮、搜索框和搜索按钮
	topContainer := container.NewBorder(
		nil,
		nil,
		nil,
		grid,
		searchEntry, // 搜索框
	)

	// 中间边框容器：密码表格
	middleContainer := container.NewBorder(
		nil,
		nil,
		nil,
		nil,
		globalTable, // 初始化密码表格
	)

	// 底部自适应容器：添加按钮，删除按钮，修改按钮，刷新按钮
	bottomContainer1 := container.NewGridWithColumns(4,
		addButtonUi(w, log, db),                  // 添加按钮
		deleteButtonUi(db, log, globalTable, w),  // 删除按钮
		editButtonUi(db, log, globalTable, w),    // 修改按钮
		refreshButtonUi(db, log, globalTable, w), // 刷新按钮
	)

	// 底部自适应容器：复制整行，复制密码，复制用户名，复制URL
	bottomContainer2 := container.NewGridWithColumns(4,
		copyRowButtonUi(w, a, globalTable),      // 复制整行
		copyUsernameButtonUi(w, a, globalTable), // 复制用户名,
		copyPasswordButtonUi(w, a, globalTable), // 复制密码
		copyUrlButtonUi(w, a, globalTable),      // 复制URL
	)

	// 底部容器：将底部自适应容器垂直排列
	bottomContainer := container.NewVBox(
		bottomContainer1,
		bottomContainer2,
	)

	// 主容器：将顶部、中间和底部容器垂直排列
	return container.NewBorder(
		topContainer,
		bottomContainer,
		nil,
		nil,
		middleContainer,
	)
}

// pswdTabsInitUi 初始化密码管理页面的表格
func pswdTabsInitUi() *widget.Table {
	// 创建一个带有表头的表格
	table := widget.NewTable(
		func() (int, int) { return len(globalPswdData), 5 }, // 修正返回值，n行5列
		func() fyne.CanvasObject {
			// 创建一个标签用于显示密码记录
			lab := widget.NewLabel("")

			// 设置标签超出部分的处理方式
			lab.Truncation = fyne.TextTruncateEllipsis

			return lab
		},
		setPasswordDataToTable, // 设置密码到表格
	)

	// 启用表头
	table.ShowHeaderRow = true

	// 自定义表头内容的创建
	table.CreateHeader = func() fyne.CanvasObject {
		return widget.NewLabel("Header Template")
	}

	// 更新自定义表头内容
	table.UpdateHeader = func(id widget.TableCellID, template fyne.CanvasObject) {
		// 根据列索引设置表头标签的文本内容
		switch id.Col {
		case 0:
			template.(*widget.Label).SetText("标题")
		case 1:
			template.(*widget.Label).SetText("用户名")
		case 2:
			template.(*widget.Label).SetText("密码")
		case 3:
			template.(*widget.Label).SetText("URL")
		case 4:
			template.(*widget.Label).SetText("备注")
		}

		// 设置表头标签的样式
		template.(*widget.Label).TextStyle = fyne.TextStyle{Bold: true}

		// 设置表头标签的对齐方式 - 左对齐
		template.(*widget.Label).Alignment = fyne.TextAlignLeading
	}

	// 设置标题列的宽度
	table.SetColumnWidth(0, 150)

	// 设置用户名列的宽度
	table.SetColumnWidth(1, 200)

	// 设置密码列的宽度
	table.SetColumnWidth(2, 200)

	// 设置URL列的宽度
	table.SetColumnWidth(3, 250)

	// 设置备注列的宽度
	table.SetColumnWidth(4, 300)

	// 设置表格的选中事件
	table.OnSelected = func(id widget.TableCellID) {
		// 检查是否点击了表头行
		if id.Row == -1 {
			return
		}

		// 检查是否在有效的行上点击
		if id.Row >= len(globalPswdData) {
			return
		}

		// 获取选中的任务
		currentSelectedRow = globalPswdData[id.Row]
	}

	// 设置表格取消选中事件
	table.OnUnselected = func(id widget.TableCellID) {
		// 检查是否在表头行上点击
		if id.Row == -1 {
			return
		}

		// 检查是否在有效的行上点击
		if id.Row >= len(globalPswdData) {
			return
		}

		// 清空选中的任务
		currentSelectedRow = globals.PswdData{}
	}

	return table
}

// addButtonUi 初始化添加按钮的对话框页面
func addButtonUi(w fyne.Window, l *fastlog.FastLog, d *sqlx.DB) fyne.CanvasObject {
	// 创建表单字段
	titleEntry := widget.NewEntry()         // 标题字段
	usernameEntry := widget.NewEntry()      // 用户名字段
	passwordEntry := widget.NewEntry()      // 密码字段
	urlEntry := widget.NewEntry()           // URL字段
	noteEntry := widget.NewMultiLineEntry() // 备注字段

	// 设置备注字段为多行
	noteEntry.Wrapping = fyne.TextWrapBreak

	// 设置密码输入框为密码模式
	passwordEntry.Password = true

	// 创建表单对话框
	form := dialog.NewForm("添加密码", "确定", "取消", []*widget.FormItem{
		{Text: "标题", Widget: titleEntry},
		{Text: "用户名", Widget: usernameEntry},
		{Text: "密码", Widget: passwordEntry},
		{Text: "URL", Widget: urlEntry},
		{Text: "备注", Widget: noteEntry},
	}, func(confirmed bool) {
		// 如果用户点击确认则执行
		if confirmed {
			// 加密密码 只有在密码不为空时才加密
			var encryptedPassword string
			if passwordEntry.Text != "" {
				encryptedPassword = cryptokey.EncodeBase64(passwordEntry.Text)
			}

			// 检查标题是否为空
			if titleEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("标题不能为空"), w)

				// 清空表单字段
				titleEntry.SetText("")
				usernameEntry.SetText("")
				passwordEntry.SetText("")
				urlEntry.SetText("")
				noteEntry.SetText("")
				return
			}

			// 检查用户名是否为空
			if usernameEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("用户名不能为空"), w)

				// 清空表单字段
				titleEntry.SetText("")
				usernameEntry.SetText("")
				passwordEntry.SetText("")
				urlEntry.SetText("")
				noteEntry.SetText("")
				return
			}

			// 检查密码是否为空
			if passwordEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("密码不能为空"), w)

				// 清空表单字段
				titleEntry.SetText("")
				usernameEntry.SetText("")
				passwordEntry.SetText("")
				urlEntry.SetText("")
				noteEntry.SetText("")
				return
			}

			// 准备插入数据
			_, err := d.Exec(
				"INSERT INTO pswd_data (title, username, password, link, description) VALUES (?, ?, ?, ?, ?)",
				titleEntry.Text,
				usernameEntry.Text,
				encryptedPassword,
				urlEntry.Text,
				noteEntry.Text,
			)
			if err != nil {
				l.Error("插入密码数据失败: ", err)
				dialog.ShowError(fmt.Errorf("添加密码失败: %v", err), w)
				return
			}
			// 刷新表格数据
			queryPswdData(d, l)

			// 清空表单字段
			titleEntry.SetText("")
			usernameEntry.SetText("")
			passwordEntry.SetText("")
			urlEntry.SetText("")
			noteEntry.SetText("")

			// 清空密码记录临时表
			_, err = d.Exec("DELETE FROM pswd_data_temp")
			if err != nil {
				l.Error("清空密码记录临时表失败: ", err)
				return
			}

			// 显示成功对话框
			dialog.ShowInformation("添加成功", "添加密码成功", w)
		}
	}, w)

	// 设置表单对话框的大小
	form.Resize(fyne.NewSize(400, 400))

	// 创建一个添加按钮
	addButton := widget.NewButton("添加", func() {
		form.Show()
	})

	// 设置添加按钮的重要性
	addButton.Importance = widget.HighImportance

	// 设置添加按钮的图标,使用内置的添加图标
	addButton.SetIcon(theme.ContentAddIcon())

	return addButton
}

// refreshButtonUi 初始化刷新按钮的页面
func refreshButtonUi(db *sqlx.DB, log *fastlog.FastLog, tab *widget.Table, w fyne.Window) fyne.CanvasObject {
	// 创建一个刷新按钮
	refreshButton := widget.NewButton("刷新", func() {
		// 取消选择所有行
		tab.UnselectAll()

		// 清空当前选中的行
		currentSelectedRow = globals.PswdData{}

		// 查询最新的密码记录
		queryPswdData(db, log)

		// // 检查查询结果
		// if len(globalPswdData) == 0 {
		// 	// 显示提示对话框
		// 	dialog.ShowInformation("提示", "没有找到任何密码数据", w)
		// 	return
		// }
	})

	// 设置刷新按钮的重要性
	refreshButton.Importance = widget.HighImportance

	// 设置刷新按钮的图标,使用内置的刷新图标
	refreshButton.SetIcon(theme.ViewRefreshIcon())

	return refreshButton
}

// deleteButtonUi 初始化删除按钮的页面
func deleteButtonUi(db *sqlx.DB, log *fastlog.FastLog, tab *widget.Table, w fyne.Window) fyne.CanvasObject {
	// 创建一个删除按钮
	deleteButton := widget.NewButton("删除", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("请先选择要删除的密码"), w)
			})
			return
		}

		// 选中用户名
		username := currentSelectedRow.Username

		// 删除选中的行
		_, err := db.Exec("DELETE FROM pswd_data WHERE id = ?", currentSelectedRow.ID)
		if err != nil {
			log.Error("删除密码数据失败: ", err)
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("删除密码失败: %v", err), w)
			})
			return
		}

		// 打印删除成功的日志
		log.Debugf("删除用户名 %s 的密码成功", username)

		// 刷新表格数据
		queryPswdData(db, log)

		// 显示成功对话框
		fyne.Do(func() {
			dialog.ShowInformation("删除成功", fmt.Sprintf("已成功删除用户名 %s 的密码", username), w)
		})

		// 清空当前选中的行
		currentSelectedRow = globals.PswdData{}

		// 取消选择所有行
		tab.UnselectAll()
	})

	// 设置删除按钮的重要性
	deleteButton.Importance = widget.HighImportance

	// 设置删除按钮的图标,使用内置的删除图标
	deleteButton.SetIcon(theme.DeleteIcon())

	return deleteButton
}

// editButtonUi 初始化编辑按钮的页面
func editButtonUi(db *sqlx.DB, log *fastlog.FastLog, tab *widget.Table, w fyne.Window) fyne.CanvasObject {
	// 创建表单字段
	titleEntry := widget.NewEntry()         // 标题字段
	usernameEntry := widget.NewEntry()      // 用户名字段
	passwordEntry := widget.NewEntry()      // 密码字段
	urlEntry := widget.NewEntry()           // URL字段
	noteEntry := widget.NewMultiLineEntry() // 备注字段

	// 设置备注字段为多行
	noteEntry.Wrapping = fyne.TextWrapBreak

	// 设置密码输入框为密码模式
	passwordEntry.Password = true

	// 创建表单对话框
	form := dialog.NewForm("编辑密码", "确定", "取消", []*widget.FormItem{
		{Text: "标题", Widget: titleEntry},
		{Text: "用户名", Widget: usernameEntry},
		{Text: "密码", Widget: passwordEntry},
		{Text: "URL", Widget: urlEntry},
		{Text: "备注", Widget: noteEntry},
	}, func(confirmed bool) {
		// 如果用户点击了确定按钮
		if confirmed {
			// 检查标题是否为空
			if titleEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("标题不能为空"), w)
				return
			}

			// 检查用户名是否为空
			if usernameEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("用户名不能为空"), w)
				return
			}

			// 检查密码是否为空
			if passwordEntry.Text == "" {
				dialog.ShowError(fmt.Errorf("密码不能为空"), w)
				return
			}

			// 加密密码
			encryptedPassword := cryptokey.EncodeBase64(passwordEntry.Text)

			// 更新选中的行
			if _, err := db.Exec("UPDATE pswd_data SET title = ?, username = ?, password = ?, link = ?, description = ? WHERE id = ?", titleEntry.Text, usernameEntry.Text, encryptedPassword, urlEntry.Text, noteEntry.Text, currentSelectedRow.ID); err != nil {
				log.Error("更新密码数据失败: ", err)
				dialog.ShowError(fmt.Errorf("更新密码失败: %v", err), w)
				return
			}

			// 刷新表格数据
			queryPswdData(db, log)

			// 显示成功对话框
			fyne.Do(func() {
				dialog.ShowInformation("更新成功", fmt.Sprintf("已成功更新用户名 %s 的密码", usernameEntry.Text), w)
			})

			// 清空表单字段
			titleEntry.SetText("")
			usernameEntry.SetText("")
			passwordEntry.SetText("")
			urlEntry.SetText("")
			noteEntry.SetText("")

			// 取消选择所有行
			tab.UnselectAll()
		}
	}, w)

	// 设置表单对话框的大小
	form.Resize(fyne.NewSize(400, 400))

	// 创建一个编辑按钮
	editButton := widget.NewButton("编辑", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("请先选择要编辑的密码"), w)
			})
			return
		}

		// 解密密码
		decryptedPassword, decodeErr := cryptokey.DecodeBase64(currentSelectedRow.Password)
		if decodeErr != nil {
			decryptedPassword = "解密失败"
		}

		// 设置表单字段的值
		titleEntry.SetText(currentSelectedRow.Title)
		usernameEntry.SetText(currentSelectedRow.Username)
		passwordEntry.SetText(decryptedPassword)
		urlEntry.SetText(currentSelectedRow.Link)
		noteEntry.SetText(currentSelectedRow.Description)

		// 打开编辑对话框
		form.Show()
	})

	// 设置按钮的重要性
	editButton.Importance = widget.HighImportance

	// 设置编辑按钮的图标
	editButton.SetIcon(theme.DocumentCreateIcon())

	return editButton
}

// copyRowButtonUi 初始化复制整行按钮的页面
func copyRowButtonUi(w fyne.Window, app fyne.App, tab *widget.Table) fyne.CanvasObject {
	// 创建一个复制整行的按钮
	copyRowButton := widget.NewButton("复制整行", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			dialog.ShowError(fmt.Errorf("请先选择要复制的密码"), w)
			return
		}

		// 获取用户名
		username := currentSelectedRow.Username

		// 获取剪贴板对象
		clipboard := app.Clipboard()

		// 清空剪切板
		clipboard.SetContent("")

		// 显示成功对话框
		fyne.Do(func() {
			dialog.ShowInformation("复制成功", fmt.Sprintf("已复制用户名 %s 的密码", username), w)
		})

		// 复制整行数据到剪切板
		clipboard.SetContent(fmt.Sprintf("%s %s %s %s %s", currentSelectedRow.Title, currentSelectedRow.Username, currentSelectedRow.Password, currentSelectedRow.Link, currentSelectedRow.Description))

		// 取消选择所有行
		tab.UnselectAll()
	})

	// 设置按钮的重要性
	copyRowButton.Importance = widget.HighImportance

	// 设置复制整行按钮的图标
	copyRowButton.SetIcon(theme.ContentCopyIcon())

	return copyRowButton
}

// 复制密码按钮的页面
func copyPasswordButtonUi(w fyne.Window, app fyne.App, tab *widget.Table) fyne.CanvasObject {
	// 创建一个复制密码的按钮
	copyPasswordButton := widget.NewButton("复制密码", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			dialog.ShowError(fmt.Errorf("请先选择要复制的密码"), w)
			return
		}

		// 检查密码是否为空
		if currentSelectedRow.Password == "" {
			// 显示错误对话框
			dialog.ShowError(fmt.Errorf("密码为空"), w)
			return
		}

		// 获取用户名
		username := currentSelectedRow.Username

		// 解密密码
		decryptedPassword, decodeErr := cryptokey.DecodeBase64(currentSelectedRow.Password)
		if decodeErr != nil {
			decryptedPassword = "解密失败"
		}

		// 获取剪贴板对象
		clipboard := app.Clipboard()

		// 清空剪切板
		clipboard.SetContent("")

		// 显示成功对话框
		fyne.Do(func() {
			dialog.ShowInformation("复制成功", fmt.Sprintf("已复制用户名 %s 的密码", username), w)
		})

		// 复制密码到剪切板
		clipboard.SetContent(decryptedPassword)

		// 取消选择所有行
		tab.UnselectAll()
	})

	// 设置按钮的重要性
	copyPasswordButton.Importance = widget.HighImportance

	// 设置复制密码按钮的图标
	copyPasswordButton.SetIcon(theme.ContentCopyIcon())

	return copyPasswordButton
}

// 复制用户名按钮的页面
func copyUsernameButtonUi(w fyne.Window, app fyne.App, tab *widget.Table) fyne.CanvasObject {
	// 创建一个复制用户名的按钮
	copyUsernameButton := widget.NewButton("复制用户名", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("请先选择要复制的用户名"), w)
			})
			return
		}

		// 获取当前行的用户名
		username := currentSelectedRow.Username

		// 获取剪贴板对象
		clipboard := app.Clipboard()
		// 清空剪切板
		clipboard.SetContent("")

		// 显示成功对话框
		fyne.Do(func() {
			dialog.ShowInformation("复制成功", fmt.Sprintf("已复制用户名 %s", username), w)
		})

		// 复制用户名到剪切板
		clipboard.SetContent(currentSelectedRow.Username)

		// 取消选择所有行
		tab.UnselectAll()
	})

	// 设置按钮的重要性
	copyUsernameButton.Importance = widget.HighImportance

	// 设置复制用户名按钮的图标
	copyUsernameButton.SetIcon(theme.ContentCopyIcon())

	return copyUsernameButton
}

// copyUrlButtonUi 初始化复制URL按钮的页面
func copyUrlButtonUi(w fyne.Window, app fyne.App, tab *widget.Table) fyne.CanvasObject {
	// 创建一个复制URL的按钮
	copyUrlButton := widget.NewButton("复制URL", func() {
		// 检查是否有选中的行
		if currentSelectedRow.ID == 0 {
			// 显示错误对话框
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("请先选择要复制的URL"), w)
			})
			return
		}

		// 检查URL是否为空
		if currentSelectedRow.Link == "" {
			// 显示错误对话框
			fyne.Do(func() {
				dialog.ShowError(fmt.Errorf("URL为空"), w)
			})
			return
		}

		// 获取当前行的用户名
		username := currentSelectedRow.Username

		// 获取剪贴板对象
		clipboard := app.Clipboard()

		// 清空剪切板
		clipboard.SetContent("")

		// 显示成功对话框
		fyne.Do(func() {
			dialog.ShowInformation("复制成功", fmt.Sprintf("已复制用户名 %s 的URL", username), w)
		})

		// 复制URL到剪切板
		clipboard.SetContent(currentSelectedRow.Link)

		// 取消选择所有行
		tab.UnselectAll()
	})

	// 设置按钮的重要性
	copyUrlButton.Importance = widget.HighImportance

	// 设置复制URL按钮的图标
	copyUrlButton.SetIcon(theme.ContentCopyIcon())

	return copyUrlButton
}

// searchData 搜索密码数据
func searchData(db *sqlx.DB, w fyne.Window, e *widget.Entry, l *fastlog.FastLog, tab *widget.Table) {
	// 如果输入框为空，则默认显示所有密码数据
	if e.Text == "" {
		queryPswdData(db, l)

		// 检查查询结果
		if len(globalPswdData) == 0 {
			// 显示提示对话框
			dialog.ShowInformation("提示", "没有找到任何密码记录", w)
			return
		}

		// 取消选择所有行
		tab.UnselectAll()

		// 显示查询结果
		//dialog.ShowInformation("查询结果", fmt.Sprintf("共找到 %d 条密码记录", len(globalPswdData)), w)
		return
	}

	// 使用map来存储去重后的记录
	uniqueResults := make(map[int]globals.PswdData)

	// 执行智能模糊查询
	query := `SELECT id, title, username, password, link, description, created_at, updated_at
	FROM pswd_data
	WHERE title LIKE ? OR username LIKE ? OR description LIKE ?
	ORDER BY updated_at DESC`

	// 定义存储查询结果的变量
	var results []globals.PswdData
	searchTerm := "%" + e.Text + "%" // 添加%来实现模糊查询

	// 执行查询
	if err := db.Select(&results, query, searchTerm, searchTerm, searchTerm); err != nil {
		l.Error("模糊查询失败: ", err)
		return
	}

	// 将查询结果存入map去重
	for _, r := range results {
		uniqueResults[r.ID] = r
	}

	// 使用局部变量存储查询结果
	localResults := make([]globals.PswdData, 0, len(uniqueResults))
	for _, v := range uniqueResults {
		localResults = append(localResults, v)
	}

	// // 检查查询结果
	// if len(localResults) == 0 {
	// 	// 显示提示对话框
	// 	dialog.ShowInformation("提示", "没有找到任何密码记录", w)
	// 	return
	// }

	// 取消选择所有行
	tab.UnselectAll()

	// 更新表格数据时使用局部变量
	updateTableData(tab, localResults)

	// 显示查询结果
	//dialog.ShowInformation("查询结果", fmt.Sprintf("共找到 %d 条密码记录", len(globalPswdData)), w)
}

// queryPswdData 查询密码数据
func queryPswdData(db *sqlx.DB, log *fastlog.FastLog) {
	// 使用局部变量存储查询结果
	var localResults []globals.PswdData

	// 构建查询语句
	query := "SELECT id, title, username, password, link, description, created_at, updated_at FROM pswd_data order by updated_at DESC"

	// 执行查询
	err := db.Select(&localResults, query)
	if err != nil {
		// 处理查询错误
		log.Error("查询密码数据失败: ", err)
		return
	}

	// 更新表格数据
	updateTableData(globalTable, localResults)
}

// setPasswordDataToTable 设置密码数据到表格中
func setPasswordDataToTable(id widget.TableCellID, obj fyne.CanvasObject) {
	// 检查行索引是否在有效范围内
	if id.Row < 0 || id.Row >= len(globalPswdData) || globalPswdData == nil {
		obj.(*widget.Label).SetText("") // 如果行索引无效或切片未初始化，设置为空字符串
		return
	}

	// 如果切片为空，则设置为空字符串
	if len(globalPswdData) == 0 {
		obj.(*widget.Label).SetText("")
		return
	}

	// 获取单元格的标签
	label := obj.(*widget.Label)

	// 根据行和列设置标签的文本内容
	if id.Row >= 0 && id.Row < len(globalPswdData) && globalPswdData != nil {
		// 根据行索引获取对应的任务
		data := globalPswdData[id.Row]

		// 解密
		decryptedPassword, decodeErr := cryptokey.DecodeBase64(data.Password)
		if decodeErr != nil {
			decryptedPassword = "解密失败"
		}

		// 根据列索引设置标签的文本内容
		switch id.Col {
		case 0: // 标题列
			label.SetText(data.Title)
		case 1: // 用户名列
			label.SetText(data.Username)
		case 2: // 密码列
			if showPassword {
				label.SetText(decryptedPassword)
			} else {
				label.SetText("***")
			}
		case 3: // URL列
			label.SetText(data.Link)
		case 4: // 备注列
			label.SetText(data.Description)
		default:
			label.SetText("") // 如果超出列范围，设置为空字符串
		}
	} else {
		label.SetText("") // 如果超出行范围，设置为空字符串
	}
}
